package ar.edu.utn.frba.dds.opendesigners.fecha;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Fecha {
	
	private Calendar date;
	
	public Fecha(Calendar fecha){
		this.date = fecha;
	}
	
	public boolean esAnterior(Fecha fechaA){
		return this.date.before(fechaA.date);
	}
	
	public boolean esPosterior(Fecha fechaA){
		return this.date.after(fechaA.date);
	}
	
	@SuppressWarnings("static-access")	
	public int getAnio(){
		return this.date.get(this.date.YEAR);
	}
	
	@SuppressWarnings("static-access")
	public int getDiasPorAnio(){
		return this.date.get(this.date.DAY_OF_YEAR);
	}
	
	@SuppressWarnings("static-access")
	public int getCantidadMaximaDiasEnAnio(){
		return this.date.getMaximum(this.date.DAY_OF_YEAR);
	}
	
	public int getDiferenciaEnDiasEntreAnios(Fecha fechaA, Fecha fechaB){
		return Math.abs(fechaA.getAnio() - fechaB.getAnio()) * 365;
	}
	
	public int cantidadDiasEntreAnios(Fecha fechaA, Fecha fechaB){
		return  this.getDiferenciaEnDiasEntreAnios(fechaA, fechaB) + (fechaA.getCantidadMaximaDiasEnAnio() - fechaB.getCantidadMaximaDiasEnAnio());
	}
	
	public int cantidadDiasEntre(Fecha fechaA, Fecha fechaB){
		return  this.cantidadDiasEntreAnios(fechaA, fechaB) + Math.abs(fechaA.getDiasPorAnio() - fechaB.getDiasPorAnio());
	}
	
	public int diasEntre(Fecha fechaA){
		return this.cantidadDiasEntre(this, fechaA);
	}
		
	//Devuelve la Fecha y la Hora en un string segun el PATTERNDATE
	public String stringfechaYHora(String patronFecha) {
		SimpleDateFormat formatDate = new SimpleDateFormat();
		formatDate.applyPattern(patronFecha);
		return formatDate.format(this.date.getTime());
	}
	//Devuelve solo la Fecha en un string segun el PATTERNDATE
	public String stringFecha(String patronFecha) {
		String[] splitString = this.stringfechaYHora(patronFecha).split(" ");
		return splitString[0];
	}

	public void diaSiguiente(){
		//Incrementa un dia a la fecha
		this.date.add(Calendar.DAY_OF_MONTH, 1);
	}
	
	public boolean igual(Fecha fecha) {
//		return this.stringDateAndHour("dd/MM/yyyy").equals(date.stringDateAndHour("dd/MM/yyyy"));
		return this.stringFecha("dd/MM/yyyy").equals(fecha.stringFecha("dd/MM/yyyy"));
	}

	public boolean anteriorOIgual(Fecha fecha) {
		return (this.esAnterior(fecha) || this.igual(fecha)); 
	}

	public boolean posteriorOIgual(Fecha fecha) {
		return (this.esPosterior(fecha) || this.igual(fecha));
	}
	
	public int getDiferenciaEnHorasEntreFechas(Fecha otraFecha){
		
		long diferencia = this.date.getTimeInMillis() - otraFecha.date.getTimeInMillis();
		
		return (int)diferencia / (60 * 60 * 1000);
		
	}
}
